package ar.com.seminario.systema.controller;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import ar.com.seminario.common.service.exception.ServiceException;
import ar.com.seminario.dto.SolicitudIngresoDto;
import ar.com.seminario.service.ISolicitudIngresoService;
import ar.com.seminario.service.SolicitudIngresoService;
import ar.com.seminario.systema.dto.LogInnDto;
import ar.com.seminario.systema.model.Usuario;
import ar.com.seminario.systema.service.ILogInnService;

/**
 * Controller para el manejo del log inn al sistema.
 * 
 * @author Pablo Lamas
 * 
 */
@Controller
public class LoginController {

	/**
	 * Servicio que controla el log inn a la aplicacion.
	 */
	@Autowired
	private ILogInnService logInnService;
	
	/**
	 * Servicio de acceso a {@link SolicitudIngresoService}.
	 */
	@Autowired
	private ISolicitudIngresoService solicitudIngresoService;

	/**
	 * Gerera una solicitud de logueo al sistema. Si el pedido es valido lo
	 * redirecciona al home.
	 * 
	 * @return un string con una definicion de tiles a la cual dirigirse
	 */
	@RequestMapping(value = "/login", method = RequestMethod.POST)
	public final ModelAndView processPasswordResetRequest(@ModelAttribute("logInnForm") LogInnDto logInnDto,
			ModelMap model, HttpServletRequest request) {

		try {

			String plaintext = logInnDto.getPassword();
			MessageDigest m;
			try {
				m = MessageDigest.getInstance("MD5");
			} catch (NoSuchAlgorithmException e) {
				return (new ModelAndView("login"));
			}

			m.reset();
			m.update(plaintext.getBytes());

			byte[] digest = m.digest();
			BigInteger bigInt = new BigInteger(1, digest);
			String hashtext = bigInt.toString(16);

			Usuario userLogged = this.logInnService.isAValidUser(logInnDto.getUsername(), hashtext);

			if (userLogged != null) {

				model.put("opciones", this.logInnService.getOptionsByUserId(userLogged.getId()));
				model.put("userLogued", userLogged);
				model.put("userLoguedperfil", userLogged.getTipoUsuario().getCode());
				model.put("perfilUsuarioId",userLogged.getTipoUsuario().getId());
				
				HttpSession session = request.getSession();
				session.setAttribute("usuarioEnSession", userLogged);
				
				Usuario usuario = (Usuario) request.getSession().getAttribute("usuarioEnSession");
				
				List<SolicitudIngresoDto> solicitudes = this.solicitudIngresoService.
							getAllSolicitudesByTipoUsuario(usuario.getTipoUsuario()); 
				
				model.put("solicitudes",solicitudes);
				if(solicitudes!=null){
					model.put("solicitudesSize",solicitudes.size());
				}else{
					model.put("solicitudesSize",0);
				}

				return (new ModelAndView("administrar-solicitudes", model));
				
			} else {
				return (new ModelAndView("portal-login", model));
			}

		} catch (final ServiceException e) {
			return (new ModelAndView("portal-login", model));
		}

	}

	/**
	 * Gerera una solicitud de logout al sistema.
	 * 
	 * @return un string con una definicion de tiles a la cual dirigirse
	 */
	@RequestMapping(value = "/logout", method = RequestMethod.GET)
	public final ModelAndView processLogOut(ModelMap model, HttpServletRequest request) {

		try {

			HttpSession session = request.getSession();
			session.removeAttribute("usuarioEnSession");

			return (new ModelAndView("portal-loguot", model));

		} catch (final Exception e) {
			return (new ModelAndView("portal-loguot", model));
		}

	}
}
